Frontier website on www.scripting.com
Frontier & The Object Model
Frontier's support of the Apple Event object model is fully integrated into the UserTalk language.
The object model is the style of interapplication communication promoted by Apple Computer and supported by AppleScript.Theory of the object model
Common to object model applications are the following characteristics that determine how they can be scripted:
- They use "object specifiers" to refer to their data;
- They support a proposed set of standard "suites" of verbs;
- They use a proposed set of standard terminology when talking about their verbs and data.
In the sections below, we discuss how Frontier taps into these common features to provide a great deal of power in controlling object model applications.
Object Specifier Paths
The most basic aspect of the object model are objects themselves. Objects are the things that an application operates on, typically its windows, documents, and the data within them.
Objects can contain other objects - windows can contain text, which might consist of paragraphs which in turn contain words and characters. This nesting of objects is known as an application's "containment hierarchy".
Objects fall into two basic categories: elements and properties. Elements are objects within a container that make up its data - words within a paragraph or cells within a spreadsheet. Properties are characteristics of an element that are singular and cannot be deleted - an object's font or color, or a window's name for example. You can change the value of a property, but you cannot delete it.
Each Apple Event suite defines a set of objects, their elements and properties, and the events (verbs) that can be applied to them. An application is free to expand on these definitions, or to support only a portion of them. For applications that support the object model, you should find an outline titled "objectHierarchy" in the application's glue table (at system.verbs.apps.[appName]) which lists objects with their elements and properties.
Object specifier paths are UserTalk expressions that refer to an object or set of objects in an application's containment hierarchy. These expressions look like Frontier object database paths, but specify a path into a target application's containment hierarchy, rather than the Frontier object database hierarchy. The key to differentiating between the two types of paths is that database paths always begin with a table name, while object specifier paths begin with a string4 value or another object specifier.
In an object specifier path, identifiers followed by an array reference (square brackets) specify an element, while identifiers not followed by an array reference specify a property. The expression within an array reference can be a number or a string, to specify objects by index or name. It can also be a comparative expression, to specify a "whose" clause - a set of objects that meet specific criteria. The "to" keyword can be used to specify a range of indices, or the range between two other objects. Finally, the array reference expression, or element specifier, can be a string4 to refer to an absolute or relative position.
Apple Events use string4 values to represent objects. Objects specifiers constructed with string4s are rather cryptic, so applications provide "user terms" which are more readable labels for objects. Frontier's objectModel table contains user terms for a standard set of objects, such as 'window', 'document', and 'paragraph'. This table also contains items that refer to a specific types of indexes such as 'last' or 'all'. When writing scripts you will always be able to construct object specifiers using only user terms and not sting4s.
Applications usually provide additional string4 values and coresponding user terms for objects specific to that application. For example Eudora provides string4s with user terms for objects like 'mailbox' and 'message'. By default, you will find these application specific values in the application's glue table, but there are times when they will be in a seperate sub-table (often named "eventInfo") to help keep the main glue table uncluttered. When this is done a third item in the "with" statement is need.
Examples
Here's an example of an object model statement in its simplest form:
with FileMaker show (record[1])If you look in the FileMaker table, you'll see that there's a script named show, and a string4 named record. As Frontier is evaluating the expression, it builds an object specifier that indicates record 1. Calling the show verb causes that record to be displayed.
Here's a richer example:
with FileMaker show (record [cell ["Name"] contains "New"])This expression walks thru FileMaker's containment hierchy, selecting all records whose cell "name" contains the sub-string "New".
In both of the previous examples, we only used terminology that's specific to FileMaker. Other terminology, that all object model applications support, is stored in the system.macintosh.ObjectModel table. In the following example we use the term "all" to specify all records, so we must include the objectModel table in the with statement:
with objectModel, FileMaker show (record [all])Object Indexes
An index to an object may be a simple number as used in lists (such as window[1]), a name (window["messages"]), or it can be a more complex conditional statement as used in the second example. The index can also be one of several special types. The following list represents several valid forms:
- message[1 to 5] a range
- window[all] every object of a class
- record[cell["name]=="New"] matches a test, can use contains, !=, etc
Properties
The object specifier for a property does not use an index, however properties are always associated with element objects. Some properties are read only. You get and set properties much like you manipulate the values of variables.
with objectModel, Eudora, eventInfo local(messageStatus) messageStatus=message[5].status if messageStatus==read beepwith objectModel, Eudora, eventInfo message[1].body="Some random text"
Note the inclusion of the eventInfo table, since Eudora keeps object terms in this subtable.
Addressing Nested Objects
You can also use the with statement to have a set of statements apply to an object nested in an application's containment hierarchy:
with objectModel, MacWordProcessor, document [1].word [1 to 4] set (font, "Palatino") set (size, 14)The string4 values "document", "word, "font" and "size" are defined in the objectModel table. The "set" verb refers to MacWordProcessor.set, and is applied to the font and size properties of words 1 thru 4 of the frontmost document.
The best way to learn the objectModel (and UserTalk in general) is to work through examples for specific applications and experiment.
Thanks
Thanks to Preston Holmes, pholmes@ucsd.edu, for converting this UserLand readme file into HTML.
![]()
© Copyright 1996-97 UserLand Software. This page was last built on Wed, Jan 22, 1997 at 3:06:42 PM with Frontier. Thanks for checking it out! Dave